package com.boot;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Server {
    public static void main(String[] args) {
        String path="src/main/resources/tmp";
        ServerSocket ss=null;
        try {
            ss = new ServerSocket(10086);
            Socket s = ss.accept();
            //一次接收50000个字节，注意：这个数量不要大于图片的字节数。
            byte[] bytes = new byte[50000];
            int count=1;
            int nums;
            BufferedInputStream bi = new BufferedInputStream(s.getInputStream());
            BufferedOutputStream bo;
            bo = new BufferedOutputStream(new FileOutputStream(path + "\\" + (count) + ".jpg"));
            while (true){
                //定义传过来的第一个字节为图片的数量，读取第一个字节，记录将传输过来的图片数量
                bi.read(bytes,0,1);
                nums=bytes[0];
                while (bi.read(bytes) != -1) {
                    //StandardCharsets.ISO_8859_1为编码形式，让字节转字符串不变形
                    String str=new String(bytes, StandardCharsets.ISO_8859_1);
                    //ReceiveOver为对方发过来的一次图片传输结束的标志
                        if (str.contains("ReceiveOver")) {
                            //将标志之前的写进这次的文件
                            bo.write(str.substring(0, str.indexOf("ReceiveOver")).getBytes(StandardCharsets.ISO_8859_1));
                            bo.flush();
                            //如果达到了传输的数量则停止接收
                            if (count==nums)
                                break;
                            //传输完一个文件，就++，给下一个文件命名
                            count++;
                            bo = new BufferedOutputStream(new FileOutputStream(path + "\\" + (count) + ".jpg"));
                            bo.write(str.substring(str.indexOf("ReceiveOver") + 11).getBytes(StandardCharsets.ISO_8859_1));
                        } else {
                            bo.write(bytes);
                        }
                    bo.flush();
                }
                bo.close();
                break;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(ss!=null) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
